#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /*
     * Lambda表达式是C++11最重要也是最常用的特性之一，是现代编程语言的一个特点，它简洁并提高了代码的效率，使得程序更加灵活
     * Qt完全支持C++语法，因此在Qt中也可以使用Lambda表达式
     *
     * 格式如下：
     * [capture](params) opt -> ret {body;};
     * - capture: 捕获列表
     * - params：参数列表
     * - opt：函数选项
     * - ret：返回值类型
     * - body：函数体
     * // 示例：
     * int ret = [](int a) -> int
     * {
     *      return a + 1;
     * }(100);
     *
     * 捕获列表：
     *   捕获一定范围内的变量
     *     [] - 不捕捉任何变量
     *     [&] - 捕获外部作用域中所有变量，并作为引用在函数体内使用(按引用捕获)
     *     [=] - 捕获外部作用域中的所有变量，并作为副本在函数体内使用(按值获取)
     *              拷贝的副本在匿名函数体内部是只读的
     *     [=, &foo] - 按值捕获外部作用域中所有变量，并按照引用捕获外部变量foo
     *     [bar] - 按值捕获bar变量，同时不捕捉其他变量
     *     [&bar] - 按引用捕获bar变量，同时不捕捉其他变量
     *     [this] - 捕获当前类中的this指针
     *              让Lambda表达式拥有和当前类成员函数同样的访问权限
     *              如果已经使用了&或=，默认添加此选项
     * 参数列表：和普通函数的参数列表一样
     *
     * opt选项(可以省略)
     *  mutable：可以修改按值传递进来的拷贝(注意只能修改拷贝而不是值本身)
     *  exception：指定函数抛出的异常，如抛出整数类型的异常，可以使用throw()
    */

    int a = 100;
    int b = 200;
    int c = 300;
    [&]()
    {
        qDebug() << "reference copy...";
        a += 2; // 修改影响外部的值
        qDebug() << "a + 1 : " << a;
        qDebug() << "b + c : " << b+c;
    }();

    [=]()mutable // 加mutable允许修改拷贝
    {
        qDebug() << "value copy...";
        a += 3; // 不影响外部a的值
        qDebug() << "a + 1 : " << a;
        qDebug() << "b + c : " << b+c;
    }();

    qDebug() << "a : " << a; // 还是102
}

MainWindow::~MainWindow()
{
    delete ui;
}

